package com.dqyt.khjc.service;


import com.dqyt.app.mongo.MaintenanceDao;
import com.dqyt.common.check.CheckInfo;
import com.dqyt.common.check.CheckTool;
import com.dqyt.common.utils.UserInfoUtil;
import com.dqyt.khjc.bean.*;
import com.dqyt.khjc.mapper.LoginHistoryMapper;
import com.dqyt.khjc.mapper.RoleMapper;
import com.dqyt.khjc.mapper.UserMapper;
import com.dqyt.khjc.swicth.SwitchConfig;
import com.dqyt.khjc.utils.IpUtil;
import com.dqyt.khjc.utils.PhoneUtil;
import com.dqyt.khjc.utils.TimeUtil;
import com.dqyt.khjc.utils.UUIDUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * 登录service
 */
@Service
public class LoginService {

    @Autowired
    private UserMapper mUserMapper;

    @Autowired
    private LoginHistoryMapper mLoginHistoryMapper;

    @Autowired
    private RoleMapper mRoleMapper;

    @Autowired
    private MaintenanceDao maintenanceDao;

    /**
     * 用户登录请求
     *
     * @param request
     * @param id
     * @param password
     * @return
     */
    public ResultMsg login(HttpServletRequest request, String id, String password) {

        ResultMsg ret = new ResultMsg(); // 声明一个返回值
        Jedis jedis = null;

        try {
            // 简单的数据检查
            if (null == id || id.length() < 3 || null == password || password.length() != 32) {
                ret.setCode(ResultMsg.FAIL);
                ret.setMsg("你的账号或者密码格式错误!");
                return ret;
            }

            User user = null;
            // 如果用户上传id是手机号
            if (PhoneUtil.isMobileNO(id)) {
                // 使用手机号查询得到用户信息
                user = mUserMapper.getUserByPhone(id);
            } else {
                // 使用账号查询得到用户信息
                user = mUserMapper.getUserByAccount(id);
            }

            // 如果用户信息不存在，或密码不相等
            if (null == user || !user.getPassword().equals(password)) {
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg("你的账号或者密码错误");
                return ret;
            }

            // ---------- 检查用户是否被限制登录 ----------
            CheckInfo userBan = CheckTool.checkUserStatueBan(user);
            if (userBan.isRet()) { // 如果数据被禁止
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg(userBan.getMsg());
                return ret;
            }


            String [] roleArray = user.getRole().split(",");
            List<Long> roleList2 = new ArrayList<Long>();
            for(int i=0;i<roleArray.length;i++){
                roleList2.add(Long.parseLong(roleArray[i]));
            }
            // 取得权限控制
            List<Role> roles = mRoleMapper.getRoleByIds(roleList2);

            // ---------- 检查用户角色是否被禁止 ----------
            List<Role> youxiao = new ArrayList<>(); // 有效角色信息

            for (Role role : roles) {
                // ---------- 检查用户角色是否被禁止 ----------
                CheckInfo roleBan = CheckTool.checkRoleBan(role);
                if (roleBan.isRet()) { // 如果数据被禁止

                } else {
                    youxiao.add(role); // 加入有效角色
                }
            }
            // 如果他的所有角色都被禁止
            if(youxiao.size() == 0) {
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg("你没有权限登陆");
                return ret;
            }
            // 设置用户权限表
            user.setAuthority(youxiao);
            // 先取得用户ip
            String ip = IpUtil.getIpAddr(request);

            //查询自己有没有 维修待核验的数据
           // long  dhyNumber = maintenanceDao.getMyMainteListTotle2(user.getUserId());
           // user.setDhyNumber(dhyNumber);
            // 记录登录信息
            LoginHistory loginHistory = new LoginHistory();
            loginHistory.setUserId(user.getUserId());
            loginHistory.setUserName(user.getUserName());
            loginHistory.setUserAccount(user.getAccount());
            loginHistory.setUserPhone(user.getPhone());
            loginHistory.setIp(ip);
            loginHistory.setMsg("WEB 登录：ip：" + ip);
            loginHistory.setTime(TimeUtil.getCurrentTimeMillis());
            loginHistory.setAddTime(TimeUtil.getCurrentTimeMillis());
            loginHistory.setAddUser(String.valueOf(user.getUserId()));
            loginHistory.setUpdateTime(TimeUtil.getCurrentTimeMillis());
            loginHistory.setUpdateUser(String.valueOf(user.getUserId()));
            loginHistory.setSysStatus(BaseBean.SYS_STATUS_OK);

            // 保存登录数据到数据库
            // 如果保存登录记录
            if(SwitchConfig.isOpen(SwitchConfig.ID_IPZZ)) {
                mLoginHistoryMapper.createLoginHistory(loginHistory);
            }

            // 保存用户信息到rdis
            user.setPassword(null);
            user.setToken(UUIDUtils.generateUuid());
            if (UserInfoUtil.saveUser_Web(user)) {
                ret.setCode(ResultMsg.SUCESS);
                ret.setMsg("登录成功！");
                ret.setData(user);
            } else {
                ret.setCode(ResultMsg.ERROR);
                ret.setMsg("未知的错误，请稍候再试！");
            }

           // System.out.println("==== 当前请求登录的IP: " + ip);

        } catch (Exception e) {
            ret.setCode(ResultMsg.ERROR);
            ret.setMsg("未知的错误，请稍候再试！");
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return ret;
    }

}
